// 继承父类的属性
function parent1(){
    this.name = "parent1";
}

function child1(){
    parent1.call(this);
    this.type = "child1";
}

console.log(new child1)

// 通过原型链，将父类中的属性移到子类的原型对象上，同时方法也通过原型链继承
// 缺点是所有子类共享父类属性
function parent2(){
    this.name = "parent2";
}

function child2(){
    this.type = "child2";
}

child2.prototype = new parent2();

console.log(new child2())

// 以上两者结合

function parent3(){
    this.name = "parent3";
}

function child3(){
    parent3.call(this);
    this.type = "child3";
}

child3.prototype = new parent3();
console.log(new child3());

// 直接赋值的方式把原型链搭建起来
// 缺点是直接赋值的话 constructor 的 指向问题
function parent4(){
    this.name = "parent4";
}

function child4(){
    parent4.call(this);
    this.type = "child4";
}

child4.prototype = parent4.prototype

// 可以直接修改constructor 属性
child4.prototype.constructor = child4;